home *** CD-ROM | disk | FTP | other *** search
/ Nebula 1 / Nebula One.iso / Mail / PhoneSlip_3.1 / Source / PhoneSlip.m < prev    next >
Text File  |  1995-06-12  |  9KB  |  400 lines

  1.  
  2. /* Copyright(C) 1993, The MITRE Corporation */
  3.  
  4. #import "PhoneSlip.h"
  5. #import "colorView.h"
  6. #import <appkit/appkit.h>
  7. #import <stdio.h>
  8. #import <strings.h>
  9. #include <mach/mach.h>
  10. #include <pwd.h>
  11. #include <sys/types.h>
  12. #include <sys/time.h>
  13.  
  14. @implementation PhoneSlip
  15.  
  16.     time_t tp;
  17.     static char *execto[4]={"csh","-f","/tmp/PhoneSlip.to",NULL};
  18.     static char *execlog[4]={"csh","-f","/tmp/PhoneSlip.log",NULL};
  19.     char *user;
  20.     char peoplefile[256] = "";
  21.     char logmailname[256] = "";
  22.     char logfilename[256] = "";
  23.     char soundname[256] = "";
  24.     char checkname[10] = "CHECK  ";
  25.     const char *temp;
  26.     int i, j, pid, ncol, nrow;
  27.  
  28.  
  29. - appDidInit:sender
  30. {
  31. /*
  32.     Here we initialize PhoneSlip
  33. */
  34.  
  35. /*
  36.     Set the background pink for color machines, gray for mono
  37. */
  38.     const NXScreen *deepestScreen;
  39.     deepestScreen=[NXApp colorScreen];
  40.     if( deepestScreen->depth == NX_TwoBitGrayDepth)
  41.         [PMcview setBackgroundGray:NX_LTGRAY]; // Gray Phone Slip
  42.     else
  43.         [PMcview setBackgroundColor:NXConvertRGBAToColor(1.0 ,0.57 ,0.77 ,1.0)]; // Pink Phone Slip 
  44.     [PMslip display];
  45.     [[PMslip window] makeKeyAndOrderFront:self];
  46.     
  47. /*
  48.     Check for user default file names and use if found
  49. */
  50.     if(temp = NXReadDefault("PhoneSlip","People"))
  51.     {
  52.       strcpy(peoplefile,temp);
  53.       [PMpeople setStringValue:peoplefile];
  54.       [PMbrowser loadColumnZero];
  55.     }
  56.     [PMbrowser loadColumnZero];
  57.     if(temp = NXReadDefault("PhoneSlip","LogMailname"))
  58.     {
  59.       strcpy(logmailname,temp);
  60.       [PMlogmail setStringValue:logmailname];
  61.     }
  62.     if(temp = NXReadDefault("PhoneSlip","LogFilename"))
  63.     {
  64.       strcpy(logfilename,temp);
  65.       [PMlogfile setStringValue:logfilename];
  66.     }
  67.     [self setLogMailname:self];
  68.     [self setLogFilename:self];
  69.  
  70. /*
  71.     Check for user defaults in the check box titles
  72. */
  73.     [PMchecked getNumRows:&nrow numCols:&ncol];
  74.     for (i=0 ; i<ncol ; i++)
  75.       for (j=0 ; j<nrow ; j++)
  76.       {
  77.         sprintf(&checkname[5],"%1d%1d",i,j);
  78.         if(temp = NXReadDefault("PhoneSlip",checkname))
  79.         {
  80.           [[PMchecked cellAt:j :i] setTitle:temp];
  81.         }
  82.         temp = [[PMchecked cellAt:j :i] title];
  83.         [[PMusercheck cellAt:j :i] setStringValue:temp];
  84.       }
  85.     
  86. /*
  87.     Set the Time field (will reset later)
  88. */
  89.     time(&tp);
  90.     [PMtime setStringValue:asctime(localtime(&tp))];
  91.     [PMfor setNextText:PMcaller];    
  92.     [PMcaller setNextText:PMorg];    
  93.     [PMorg setNextText:PMnumber];    
  94.     [PMnumber setNextText:[PMmsg docView]];
  95.         
  96. /*
  97.     Get the users Full name from accounting/password info
  98. */
  99.     setpwent();
  100.     user = getpwuid((uid_t)getuid())->pw_gecos;
  101.     endpwent();
  102.     [PMsigned setStringValue:user];
  103.       
  104. /*
  105.     Load the addressee browser
  106. */
  107.     [PMbrowser setDelegate:self];
  108.     [PMbrowser loadColumnZero];
  109.     [PMbrowser setTarget:self];
  110.     [PMbrowser setAction:@selector(setFor)];
  111.     return self;
  112. }
  113.  
  114. - send:sender
  115. {
  116. /*
  117.     Performed when user clicks Send
  118. */
  119.  
  120.     FILE *PMmail, *PMtemp, *PMlog;
  121.     char *to, msg[4096], toString[100], *address;
  122.  
  123. /*
  124.     Reset Time field before sending message
  125. */
  126.     time(&tp);
  127.     [PMtime setStringValue:asctime(localtime(&tp))];
  128.  
  129. /*
  130.     get addressee
  131. */
  132.     to = (char *)[PMfor stringValue];
  133.     if(strlen(to) == 0)
  134.     {
  135.       NXRunAlertPanel("PhoneSlip","No addressee selected", "Sorry", NULL, NULL);
  136.       return self;
  137.     }
  138.     strcpy(toString,to);
  139.     if (toString[strlen(toString)-1] == '\n')
  140.       toString[strlen(toString)-1]=0;
  141.     address = strpbrk(toString,"<");
  142.     *(strpbrk(address,">")+1) = 0;
  143.     
  144. /*
  145.     Build message in temporary file from contents of text fields
  146. */
  147.     [[PMmsg docView] getSubstring:msg start:0 length:[[PMmsg docView] textLength]];
  148.     msg[[[PMmsg docView] textLength]] = 0;
  149.     
  150.     PMtemp = fopen("/tmp/PhoneSlip.msg","w");
  151.     fprintf(PMtemp,"---------------PHONE MESSAGE--------------\n");
  152.     fprintf(PMtemp,"FROM: %s\n",(char *)[PMcaller stringValue]);
  153.     fprintf(PMtemp,"OF: %s\n",(char *)[PMorg stringValue]);
  154.     fprintf(PMtemp,"NUMBER: %s\n\n",(char *)[PMnumber stringValue]);
  155.     for (i=0 ; i<ncol ; i++)
  156.       for (j=0 ; j<nrow ; j++)
  157.         if([[PMchecked cellAt:j :i] state])
  158.           fprintf(PMtemp,"%s\n",[[PMchecked cellAt:j :i] title]);
  159.     fprintf(PMtemp,"%s\n\n",msg);
  160.     fprintf(PMtemp,"SIGNED: %s\n",[PMsigned stringValue]);
  161.     fprintf(PMtemp,"---------------PHONE MESSAGE--------------\n");
  162.     fclose(PMtemp);
  163.  
  164. /*
  165.     If PRINT is specified in addressee field, print a PS copy of the slip
  166. */
  167.     if(strstr(to,"PRINT"))
  168.     {
  169.       [PMslip printPSCode:self];
  170.     }      
  171.     
  172. /*
  173.     If ONLY is NOT specified in addressee field, use ucb mailer to send
  174.     the message 
  175. */
  176.     if(!strstr(to,"ONLY"))
  177.     {
  178.       PMmail = fopen("/tmp/PhoneSlip.to","w");
  179.       fprintf(PMmail,"/usr/ucb/mail -s 'PHONE SLIP' '%s' </tmp/PhoneSlip.msg\n",address);
  180.       fclose(PMmail);
  181.       pid = vfork();
  182.       if(pid == 0)
  183.         execve("/bin/csh",execto,NULL);
  184.     }
  185.  
  186. /*
  187.     If a mail log user name is specified, send a copy to that address also
  188. */
  189.     if (strlen(logmailname))
  190.     {
  191.       PMmail = fopen("/tmp/PhoneSlip.log","w");
  192.       fprintf(PMmail,"/usr/ucb/mail -s 'PhoneSlip for %s' '%s' </tmp/PhoneSlip.msg\n",address,logmailname);
  193.       fclose(PMmail);
  194.       pid = vfork();
  195.       if(pid == 0)
  196.         execve("/bin/csh",execlog,NULL);
  197.     }
  198.  
  199. /*
  200.     If a mail log file name is specified, append a copy to the log file
  201. */
  202.     if (strlen(logfilename))
  203.     {
  204.       if(PMlog = fopen(logfilename,"a"))
  205.       {
  206.         fprintf(PMlog,"TO: %s",(char *)[PMfor stringValue]);
  207.         fprintf(PMlog,"AT: %s",(char *)[PMtime stringValue]);
  208.         fprintf(PMlog,"FROM: %s",(char *)[PMcaller stringValue]);
  209.         fprintf(PMlog,"OF: %s",(char *)[PMorg stringValue]);
  210.         fprintf(PMlog,"NUMBER: %s",(char *)[PMnumber stringValue]);
  211.         for (i=0 ; i<ncol ; i++)
  212.           for (j=0 ; j<nrow ; j++)
  213.             if([[PMchecked cellAt:j :i] state])
  214.               fprintf(PMlog,"%s\n",[[PMchecked cellAt:j :i] title]);
  215.         fprintf(PMlog,"%s\n",msg);
  216.         fprintf(PMlog,"SIGNED: %s\n\n",[PMsigned stringValue]);
  217.         fclose(PMlog);
  218.       }
  219.       else
  220.         NXRunAlertPanel("PhoneSlip","Unable to open PhoneSlip log, check permissions", "Sorry", NULL, NULL);
  221.     }
  222.          
  223.      
  224. /*
  225.     Reset PhoneSlip fields
  226. */
  227.     [self cancel:self];
  228. /*
  229.     play the acknowledge sound
  230. */
  231.     [[Sound findSoundFor:[PMsoundname stringValue]] play];
  232. /*
  233.     hide PhoneSlip
  234. */
  235.     [NXApp hide:self];
  236.     
  237.     return self;
  238. }
  239.  
  240. - cancel:sender
  241. {
  242.     int i, j, ncol, nrow;
  243.  
  244. /*
  245.     Reset PhoneSlip fields
  246. */
  247.     [PMfor setStringValue:""];
  248.     [PMcaller setStringValue:""];
  249.     [PMorg setStringValue:""];
  250.     [PMnumber setStringValue:""];
  251.     [PMchecked getNumRows:&nrow numCols:&ncol];
  252.     for (i=0 ; i<ncol ; i++)
  253.       for (j=0 ; j<nrow ; j++)
  254.         [[PMchecked cellAt:j :i] setState:NO];
  255.     [[PMchecked cellAt:0 :0] setState:YES];
  256.     [PMchecked display];
  257.     [[PMmsg docView] selectAll:self];
  258.     [[PMmsg docView] replaceSel:"NO MESSAGE"];
  259.  
  260.     return self;
  261. }
  262.  
  263. - (int)browser:sender fillMatrix:matrix inColumn:(int)column
  264. {
  265. /*
  266.     Load addressee browser
  267. */
  268.     FILE *People;
  269.     char    buf[80];
  270.     int    row;
  271.     id    cell;
  272.  
  273.     row = 0;
  274.     strcpy(peoplefile,[PMpeople stringValue]);
  275.     if (strlen(peoplefile) == 0)
  276.     {
  277.       strncpy(peoplefile,NXArgv[0],255);
  278.           *rindex(peoplefile,'/') = 0; 
  279.           strcat(peoplefile,"/people");
  280.     }
  281.     if ((People = (FILE *)fopen(peoplefile,"r")) != NULL)
  282.     {
  283.       while (!feof(People))
  284.       {
  285.         fgets(buf,79,People);
  286.         [matrix addRow];
  287.         cell = [matrix cellAt: row  :0];    
  288.         [cell setStringValue:buf];
  289.         [cell setLoaded:YES];
  290.         [cell setLeaf:YES];
  291.         row++;
  292.       }
  293.  
  294.       fclose(People);
  295.     }
  296.     else
  297.     {
  298.       NXRunAlertPanel("PhoneSlip","NO PEOPLE FILE FOUND", "RETRY", "FAIL", "ABORT");
  299.     }
  300.  
  301.     [PMbrowser setEnabled:YES];
  302.     return row-1;
  303. }
  304.  
  305. - setFor
  306. {
  307.         
  308. /*
  309.     set the addresse field from the currently selected browser line
  310. */
  311.     [PMfor setStringValue:[[[PMbrowser matrixInColumn:0] selectedCell] stringValue]];
  312.     [PMcaller selectText:self];
  313.  
  314. /*
  315.     Reset Time
  316. */
  317.     time(&tp);
  318.     [PMtime setStringValue:asctime(localtime(&tp))];
  319.     return self;
  320. }
  321.  
  322. - setPeople:sender
  323. {
  324. /*
  325.     Reset the people file name and reload the browser
  326. */
  327.     const char *peoplepref;
  328.     
  329.     peoplepref = [PMpeople stringValue];
  330.     if (strlen(peoplepref))
  331.     {
  332.       (strcpy(peoplefile,peoplepref));
  333.       [PMbrowser loadColumnZero];
  334.       NXWriteDefault("PhoneSlip","People",peoplefile);
  335.     }
  336.     
  337.     return self;
  338. }
  339.  
  340. - setLogMailname:sender
  341. {
  342. /*
  343.     Reset the log file name
  344. */
  345.     const char *logpref;
  346.  
  347.     
  348.     logpref = [PMlogmail stringValue];
  349.     if(strlen(logpref))
  350.     {
  351.       strcpy(logmailname,logpref);
  352.       NXWriteDefault("PhoneSlip","LogMailname",logmailname);
  353.     }
  354.     
  355.     return self;
  356. }
  357.  
  358. - setLogFilename:sender
  359. {
  360. /*
  361.     Reset the log file name
  362. */
  363.     const char *logpref;
  364.  
  365.     
  366.     logpref = [PMlogfile stringValue];
  367.     if(strlen(logpref))
  368.     {
  369.       strcpy(logfilename,logpref);
  370.       NXWriteDefault("PhoneSlip","LogFilename",logfilename);
  371.     }
  372.     
  373.     return self;
  374. }
  375.  
  376. - setCheck:sender
  377. {
  378.     int col,row;
  379.     
  380.     col = [PMusercheck selectedCol]; 
  381.     row = [PMusercheck selectedRow]; 
  382.     temp = [[PMusercheck selectedCell] stringValue];
  383.     [[PMchecked cellAt:row :col] setTitle:temp];
  384.     sprintf(&checkname[5],"%1d%1d",col,row);
  385.     NXWriteDefault("PhoneSlip",checkname,temp);
  386.     return self;
  387. }
  388.  
  389. - setSoundname:sender
  390. {
  391.     temp = [PMsoundname stringValue];
  392.     strcpy(soundname,temp);
  393.     [[Sound findSoundFor:soundname] play];
  394.     NXWriteDefault("PhoneSlip","Soundname", soundname);
  395.     return self;
  396. }
  397.  
  398.  
  399. @end
  400.